#include<iostream>
using namespace std;


int main(){
// && 操作布尔类型的值
    // cout << (17>9 && 6<9) <<endl;
    // cout << (3<10 && 10<6) <<endl;
// ||
// 逻辑&& 和|| 有短路的效果 ,&&前面的失败,
// 则后面的表达式就不尽兴操作
    int num1=100;
    int num2=102;
    // cout << (num1> num2 && num2++ >103) <<endl;
    // cout <<  num1 <<endl;
    // cout <<  num2 <<endl;
// !

// 三元运算符

    int s1=1110;
    int s2=120;

    // cout<< (s1>s2 ? s1:s2) <<endl;

// 位运算 都是对应二进制数来看的
// 逻辑按位元素 & | ~ ^
// & 按位与 只有有一位为0则为0
cout << "& 按位与 只有有一位为0则为0" <<endl;
    cout << (3&5) <<endl;
// | 按位或 只有有一位为1则为1
cout << "| 按位或 只有有一位为1则为1" <<endl;
    cout << (3|5) <<endl;
// ~ 按位非 将操作数的每一个位都取反
cout << "~ 按位非 将操作数的每一个位都取反" <<endl;
    cout << (~5) <<endl;
// ^ 按位异或 两位相同返回0，不同返回1
cout << "^ 按位异或 两位相同返回0,不同返回1" <<endl;
    cout << (-3^5) <<endl;
    // 一个数异或另一个数两次得到它本身
cout << "一个数异或另一个数两次得到本身" <<endl;
    int x=10;
    int y=20;
    cout << x <<endl;
    cout << y <<endl;
   cout << "====================================" <<endl;
    x=x^y; // x=10^20
    y=x^y; // y=10^20^20=10
    x=x^y; // x=10^20^10=20
    cout << x <<endl;
    cout << y <<endl;

cout << "====================================" <<endl;
// 移位运算符 <<,>>
// << 左移 整体左移指定位数，被移除的高位丢失
// >> 右移 整体右移指定位数,无符号数空位补0，
// 有符号数空位用原来最左边的位数来补。被移除的地位丢失
    cout << (2<<1) <<endl; 
    cout << (2>>1) <<endl;

    return 0;
}